from machine import Pin
from neopixel import NeoPixel 
import time
import random

#1,2面的io定义

mian01 = Pin(13,Pin.OUT) ###定义引脚
m01 = NeoPixel(mian01,72)###定义灯的个数

#1,2面的io定义

mian23 = Pin(12,Pin.OUT) ###定义引脚
m23 = NeoPixel(mian23,72)###定义灯的个数

#1,2面的io定义

mian45 = Pin(14,Pin.OUT) ###定义引脚
m45 = NeoPixel(mian45,72)###定义灯的个数


#定义平面坐标系
def zb(x,y):
	zuobiao = x+y*6
	return zuobiao 

#定义反坐标
def fzb(fb):
	x = int(fb%6)
	y = int(fb/6)
	return (x,y)

#定义整个平面的中间（过度）列表   所有修改操作都在这个列表上进行 然后把这个列表给写到 2812中
body = []
for i in range(36):
	body.append((0,0,0))

#剩余空间 输入蛇的位置给函数，计算出剩余的空间
def sykj(parameter_list=[]):
	zy = []
	pl = []
	for i in parameter_list:#zy把蛇的（x,y）转换成数字列表后
		zy.append(zb(i[0],i[1]))
	for i in range(36):#生成一个空的数字列表  列表里面的内容代表着1-36个灯 
		pl.append(i)
	for i in zy:#排除1-36个灯里面有蛇位置的灯，然后就是可以产生随机豆豆的灯的位置
		pl.remove(i)
	return pl


#随机产生一个不重复的豆豆 
def bean(parameter_list=[]):
	a = 0  #标志位作为是否有重复灯的标志位
	nb = 0
	colour = []
	while a == 0 : #标志位为0时有重复  重新随机  
		nb = random.getrandbits(30)%36 #产生一个随机的数对36取余数
		a = parameter_list.count(nb) #.count(nb) 在列表里面找元素 如果包含此元素返回1 不包含返回0 这里是不包含蛇位置的列表  所以如果随机数在列表内 返回1 
	for i in range(3):#产生随机颜色
		colour.append(random.getrandbits(30)%50)
	colour = tuple(colour)#列表转换为元组
	position = fzb(nb)
	return [position,colour]
global snake_colour 
Snake_Long=[(0,0)]
Snake_Colour=(5,5,5)
#显示\刷新整个图案的形状 输入蛇的（位置和颜色），豆豆的位置和颜色
def snake_display(parameter_list=[],snake_colour=(),bean=(),bean_colour=()):
	nb = zb(bean[0],bean[1])
	nb = int(nb)
	long=[]  #定义蛇坐标轴转换成列表的数字列表
	for i in parameter_list:
		long.append(zb(i[0],i[1]))
	for i in range(36):#清空整个界面的中间列表里面的颜色数据
		body[i] = (0,0,0)
	for i in long:#把蛇的颜色数据填上
		body[i] = snake_colour
	body[nb] = bean_colour#填上豆豆的颜色数据
	for i in range(36): #写到ws2812内
		m23[i]=body[i]
	m23.write()
#除去蛇身体的部分，剩余的空间坐标点
def Trail(parameter_list):
	trajectory =sykj(parameter_list)
	for i in trajectory:
		trail.append(fzb(i))
	return trail

    
#蛇的移动轨迹
def snake_MovingTrack(parameter_list=[],bean=()):
	movingtrack=[]
	flag=0
	smt=parameter_list[0] #第0个坐标值
	x = bean[0]-smt[0] #横向位移距离
	y = bean[1]-smt[1]#纵向位移距离
	if x > 0 :#豆豆是否在蛇头右端
		if y > 0:#豆豆是否在蛇头上端
			while stm != bean :	#最后接触到点时结束	
				trail = Trail(parameter_list)	#剩余的部分	
				if flag == 0 : #标志位0时右向移动
					stms = (smt[0]+1,smt[1])#先向右移动一位
					if bean[0]-smt[0] == 0 : #判断是否x轴坐标相同 如果是进行Y周移动
						a = 1
					else if trali.count(stms):#重新判断移动后的蛇头是否在剩余空间
						parameter_list.insert(0,stms)
						else 
						








			






#蛇的移动
def snake_move(parameter_list=[],snake_colour=(),bean=(),bean_colour=()):
	global Snake_Colour
	global Snake_Long
	move = ()
	x = 0
	y = 0
	move=parameter_list[0]#蛇头的坐标值
	x = bean[0]-move[0]
	y = bean[1]-move[1]
	if x == 0 :
		for i in range(y-1):
			move=parameter_list[0] #获取当前蛇头的坐标
			move=(move[0],move[1]+1)#向上移动一个位置
			parameter_list.insert(0,move)#把移动位置添加在最前面
			del parameter_list[-1]#删除最后一个值
			time.sleep_ms(500)	
			snake_display(parameter_list,snake_colour,bean,bean_colour)#显示刷新整个图案
	if x != 0:
		if y == 0:
			for i in range(x-1):#算出蛇要向右边移动的次数
				move=parameter_list[0] #获取当前蛇头的坐标
				move=(move[0]+1,move[1])#向右移动一个位置
				parameter_list.insert(0,move)#把移动位置添加在最前面
				del parameter_list[-1]#删除最后一个值
				time.sleep_ms(500)
				snake_display(parameter_list,snake_colour,bean,bean_colour)#显示刷新整个图案
		if y != 0 :
			for i in range(x):#算出蛇要向右边移动的次数
				move=parameter_list[0] #获取当前蛇头的坐标
				move=(move[0]+1,move[1])#向右移动一个位置
				parameter_list.insert(0,move)#把移动位置添加在最前面
				del parameter_list[-1]#删除最后一个值
				time.sleep_ms(500)
				snake_display(parameter_list,snake_colour,bean,bean_colour)#显示刷新整个图案
			for i in range(y-1):#算出蛇要向上边移动的次数
				move=parameter_list[0] #获取当前蛇头的坐标
				move=(move[0],move[1]+1)#向上移动一个位置
				parameter_list.insert(0,move)#把移动位置添加在最前面
				del parameter_list[-1]#删除最后一个值
				time.sleep_ms(500)	
				snake_display(parameter_list,snake_colour,bean,bean_colour)#显示刷新整个图案
	time.sleep_ms(500)
	Snake_Long.insert(0,bean)
	Snake_Colour = bean_colour
	



bean_position = sykj(Snake_Long)
bean_state=bean(bean_position)
snake_display(Snake_Long,Snake_Colour,bean_state[0],bean_state[1])
snake_move(Snake_Long,Snake_Colour,bean_state[0],bean_state[1])
bean_position = sykj(Snake_Long)
bean_state=bean(bean_position)
snake_display(Snake_Long,Snake_Colour,bean_state[0],bean_state[1])



